2 1 2 Numeropeli.IFF 0 0 3 Pelipuu.IFF 0 0* {3 Pelipuuta ilman muuta {3 --------------------- Petri Keckman Nyt on hyvä peli! Älkää jättäkö sitä kokeilematta aikaisempien kokemustenne pe- rusteella "peleistäni". Yli kymmenen vuoden tauon jälkeen päätin ryhtyä käyttämään Pascal-ohjelmointi- kieltä. Voi miksi olen yrittänytkään koskaan käyttää mitään muuta? Se on Amigal- la helppoa ja halpaa PCQ-freeware-kääntäjällä - sen jälkeen kun systeemin saan- nut asetettua ja sitä on oppinut käyttämään... tai no jaa, melkoista pilkunvii- lausta se ohjelmointi aina on. Pascal oli hallitseva opetuskieli yliopistomaailmassa 70- ja vielä pitkälti 80-luvulla. Pascalin syntaksissa kaikki muuttujat ja tyypit on esiteltävä lohko- jen (ts. ohjelmien tai aliohjelmien) alussa, mikä aluksi saattaa tuntua hanka- lalta mutta kuitenkin helpottaa ohjelmointia ja karsii huolimattomuusvirheitä, kun ne eivät mene edes kääntäjästä läpi... tai niiden ei pitäisi; vaikuttaa siltä, että esimerkiksi Integer- ja Real-tyyppisiä muuttujia saa PCQ:ssa käyttää samoissa lausekkeissa, jolloin saattaa tulla virheitä, kun Real-luvun tallennus tulkitaan Integeriksi. Pascal suosii - ellei peräti vaadi - rakenteellista ohjelmointia, jossa ohjel- moitava ongelma on jaettu selkeisiin aliohjelmiin. Se muistuttaa paljolti C- kieltä. Kuten yleensäkin ohjelmointikielillä, silläkin voi tehdä tietysti vaikka mitä. Eroja on lähinnä syntaksin pilkkusäännöissä. Sillä on tullut suoritettua perus- ja aineopintojen labroja - suoritettua, mut- tei palautettua. Olin niin kypsynyt yliopiston arvomaailmaan, jossa tärkeintä oli kerätä suorituspisteitä kopioimalla laskuharjoituksia, että menin toiseen äärimmäisyyteen: opiskelin omaksi huvikseni ja tiedokseni ja jätin merkkaamatta laskuharjoitukset ja palauttamatta labrat. Helvettiäkö minun ohjelmointiharras- tukseni muille kuului? Ohjelmat-hakemistosta löytyvän numeropeli-ohjelman eräs versio tuli kuitenkin aikoinaan palautettua "Tietorakenteet"-kurssiin kuuluvana harjoitustyönä, joskus vuonna 1987, silloin kun vielä uskalsin kuvitella osaavani ohjelmoida. Siinä harjoiteltiin pelipuun käsittelyä. Pelipuu on tietorakenne, johon rakennetaan kustakin pelitilanteesta vaihtoehtoiset jatkotilanteet ja valitaan paras mahdol- linen siirto. Pelilaudan tilannetta kuvaa arvofunktio, joka on pelipuun solmun arvo. Koko pelilaudan tilannetta ei siis tallenneta solmun arvoksi, vaan vain arvofunktion arvo. Pelipuuta rakennettaessa täytyy pelilaudan tilannekin olla kuitenkin selvillä, jotta sitä päästään rakentamaan. Siksi pelipuun solmuun tal- lennetaan myös tehdyn siirron sarake- tai rivi-indeksi. Numeropelin idea on yksinkertainen: pelaajat nostavat vuorotellen numeroituja laattoja, toinen rivittäin, siltä riviltä, jolta toinen (sarakkeittain pelaava) oli poistanut laatan. Viimeksi poistetun laatan paikalle siirretään tähtilaatta. Laattojen numerot lasketaan yhteen. Suuremman summan kerännyt on voittanut ti- lanteessa, jossa vuorossa oleva ei pääse enää jatkamaan, kun laatat ovat loppu- neet. Tähän peliin liittyvä pelitilannetta kuvaava arvofunktio, jonka pelipuual- goritmi tarvitsee, on siis äärimmäisen yksinkertainen: kerättyjen laattojen sum- masta vähennetään vastustajan keräämien laattojen summa. {D ----------> {1 Algoritmi on ajanut pelaajan tuka- {1 laan asemaan ja johtaa 40-27. Pe- {1 laajalla nostettavina laatat -11, {1 -12 tai -11. {1 ----------> {1 Pelipuun yksi haara kolme siir- {1 toa eteenpäin. Algoritmissa tal- {1 lennusmuoto on pinotetut jonot. {1 ----------> Alkuperäinen versio kaukaisilta opiskeluajoiltani tulosti merkkigrafiikkaa käskyrivi-ikkunaan, josta alla huvin vuoksi esimerkkiajon alkua ja loppua. Kone aloitti poistamalla täydeltä pelilaudalta laatan riviltä 3 sarakkeelta 2. 8.H1:OHJELMOINTI/pcq12d> omat/numeropeli ************************************************************* * JOS HALUAT MUUTTAA JONKIN ALLAOLEVAN ASETUKSEN ARVOA, * * NIIN SYOTA VASTAAVA NUMERO 1..7. * ************************************************************* 1. KONE ALOITTAA. 2. KONE PELAA SARAKKEITTAIN. 3. OHJELMA ARPOO LAATOILLE PAIKAT JA ARVOT 4. LAATTOJEN PIENIN ARVO = -8 5. LAATTOJEN MAKSIMI ARVO = 8 6. OHJELMA TUTKII 6 SIIRTOA ETEENPAIN. 7. KONE PELAA KAYTTAJAA VASTAAN. JOS HALUAT MUUTTAA PELIKENTAN KOKOA 4x4, NIIN MUUTA OHJELMASTA VAKION maxind ARVOA. ************************************************************* * SYOTA 8 KUN HALUAT LOPETTAA KOKO OHJELMAN TAI * * SYOTA 0 KUN OLET VALMIS PELAAMAAN. * ************************************************************* 0. ALETAAN PELAAMAAN. 8. LOPETETAAN PELAAMINEN. SYOTA LUKU 0..8 ? 0 SARAKE=1 2 3 4 RIVI ::::::::::::::::: PELITILANNE: 1 : 1: -1: 7: 4: KONE =0 ::::::::::::::::: PELAAJA=0 2 : -1: -8: -5: 1: ::::::::::::::::: 3 : 0: 7: 6: -7: ::::::::::::::::: 4 : -8: -1: 0: 4: ::::::::::::::::: SARAKE=1 2 3 4 RIVI ::::::::::::::::: PELITILANNE: 1 : 1: -1: 7: 4: KONE =7 ::::::::::::::::: PELAAJA=0 2 : -1: -8: -5: 1: ::::::::::::::::: 3 : 0: * : 6: -7: ::::::::::::::::: 4 : -8: -1: 0: 4: ::::::::::::::::: SYOTA POISTETTAVAN LAATAN SARAKEINDEKSI VALILTA 1..4: 3 SARAKE=1 2 3 4 RIVI ::::::::::::::::: PELITILANNE: 1 : 1: -1: 7: 4: KONE =7 ::::::::::::::::: PELAAJA=6 2 : -1: -8: -5: 1: ::::::::::::::::: 3 : 0: : * : -7: ::::::::::::::::: 4 : -8: -1: 0: 4: ::::::::::::::::: SARAKE=1 2 3 4 RIVI ::::::::::::::::: PELITILANNE: 1 : 1: -1: * : 4: KONE =14 ::::::::::::::::: PELAAJA=6 2 : -1: -8: -5: 1: ::::::::::::::::: 3 : 0: : : -7: ::::::::::::::::: 4 : -8: -1: 0: 4: ::::::::::::::::: SYOTA POISTETTAVAN LAATAN SARAKEINDEKSI VALILTA 1..4: 4 ..jne. jne... SARAKE=1 2 3 4 RIVI ::::::::::::::::: PELITILANNE: 1 : 1: -1: : : KONE =13 ::::::::::::::::: PELAAJA=-14 2 : : : : : ::::::::::::::::: 3 : : : : : ::::::::::::::::: 4 : * : : : : ::::::::::::::::: SARAKE=1 2 3 4 RIVI ::::::::::::::::: PELITILANNE: 1 : * : -1: : : KONE =14 ::::::::::::::::: PELAAJA=-14 2 : : : : : ::::::::::::::::: 3 : : : : : ::::::::::::::::: 4 : : : : : ::::::::::::::::: SYOTA POISTETTAVAN LAATAN SARAKEINDEKSI VALILTA 1..4: 2 SARAKE=1 2 3 4 RIVI ::::::::::::::::: PELITILANNE: 1 : : * : : : KONE =14 ::::::::::::::::: PELAAJA=-15 2 : : : : : ::::::::::::::::: 3 : : : : : ::::::::::::::::: 4 : : : : : ::::::::::::::::: KONE EI VOI TEHDA ENAA SIIRTOA. HAVISIT TALLA KERTAA. Vaikka peli on yksinkertainen - tai juuri sen takia - on se ihmiselle kuitenkin sen verran vaikeaa, etten ole Amigaani kertaakaan voittanut vähänkään isommilla vaikeustasoilla. Tosin en jaksakaan yleensä miettiä kuin korkeintaan kaksi siir- toa eteenpäin - yleensä näpäytän hiirellä sitä rivin suurinta laattaa. Kuinka kone sitten tarkemmin ottaen tekee siirtonsa? Samalla tavalla kuin ihmi- nen yrittää miettiä: jos nostan tuon laatan, niin se nostaa tuon laatan, jolloin minun on nostettava jokin noista, jolloin kone pääsee kuitenkin nostamaan tuon laatan jne... Pelipuuhun rakennetaan osoitinmuuttujilla solmut ja linkit tietty määrä siirtoja eteenpäin. Solmun arvona on siis arvofunktion arvo (=KONE-PELAAJA). Jos pelilau- dan koko on vaikkapa 10x10 ruudukko, nousee solmujen määrä äkkiä melko suureksi. Kuusi tasoa eteenpäin tutkittaessa lukumäärä lähestyy miljoonaa. Tästä johtuen ei algoritmissa suinkaan rakenneta koko puuta, vaan yksi haara kerrallaan, eli solmuja tarvitaan vain kuusi kerrallaan. Tilantarve on siis kokoluokkaa 6x sol- mun koko, mutta koska kaikki solmut käydään läpi, on ajan tarve maksimissaan (ts. pelin alussa) luokkaa 10^6 (lopussa lähenee ykköstä, kun siirtoja ei voi enää tehdä). Mitä sitten, kun pelipuu on saatu rakennettua? (Pee-lipuu on raa-ken-nettu, pee- lii on joo ovella, nuumeeria riipustettu ompi laudan ruuduille - ei kun joulu meni jo?) Kuinka Amiga valitsee siirtonsa? Olisiko houkuttelevinta valita se siirto, jota pitkin pääsee alimman tason solmuun, jossa arvofunktion arvo on suurin? Ei, sillä koneella on vastassa älykäs ihminen, joka myös haluaisi päästä solmuun, jossa arvofunktion arvo on pelaajalle edullisin. Algoritmi purkaa pelipuuta alhaalta ylöspäin ja nostaa alemmalta tasolta par- haimman siirron ylemmälle tasolle. Se on siis vuorotellen arvofunktion suurin ja pienin arvo, koska joka toisen siirron tekee kone ja joka toisen ihminen. Lopul- ta kone valitsee sen siirron, jota kuvaavaan solmuun on nostettu suurin arvo. Vaikka alkuperäisessä versiossa oli suurin osa muuttujista ohjelman ajoaikana muutettavissa, ei tässä Amiga-versiossa pääse niitä muuttamaan. Pelilaudan koko pysyy siis 6x6:ssa ja tasoja tutkitaan kahdeksan eteenpäin. En ole vielä oikein saanut rakenneltua gadtools-juttuja... Muuten ohjelma moniajaa nätisti. On siinä valikotkin. Ja ennen kaikkea ikkunan kokoa voi vapaasti muuttaa ajon aikana. Kirjoittajan kotisivu löytyy osoitteesta http://www.mbnet.fi/~keckman.